package com.cas;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;


/**
 * 多核cpu 原子性如何保证
 * http://ifeve.com/atomic-operation/
 */
public class AtomicIntegerTest {

    public static void main(String[] args) {




        AtomicInteger atomicInteger = new AtomicInteger(3);

        /**
         * CAS 的原理
         *  1. 前提条件
         *      1.1 使用了volatile 对变量在多线程中的可见性原则
         *      1.2 使用了 cpu compareAndSwap 的原子性指令，即在执行这个指令时，其他即将要执行该指令的线程处于阻塞状态，等本线程执行完成之后，才执行
         *
         *  2. cas执行过程
         *      2.1 读取变量主内存中的值到工作内存 (因为变量使用volatile修饰，所以每次读取的都是与主内存中的值一致)
         *      2.2 通过 cas 原子性操作，对比工作内存中的值与主内存中的是否一致，如果一致就把主内存的值设置为要更新的值，如果不一致，则重新继续2.1的操作
         */
        boolean b = atomicInteger.compareAndSet(3, 4);
        System.out.println(b);
    }


}
